package article6.unnecessary.object;

import java.util.regex.Pattern;

/**
 * 避免创建不必要的对象
 * 是否存在有效的罗马数字
 *
 * @Author: cctv
 * @Date: 2019/3/27 11:43
 */
public class RomanNumerals {
    /**
     *Performance can be greatly improved! 性能可以大大提升
     * @param s
     * @return
     */
    static boolean isRomanNumeral(String s) {
        return s.matches("^(?=.)M*(C[MD]|D?C{0,3})"
                + "(X[CL]|L?X{0,3})(I[XV]|V?I{0,3})$");
    }


    private static final Pattern ROMAN = Pattern.compile("^(?=.)M*(C[MD]|D?C{0,3})"
            + "(X[CL]|L?X{0,3})(I[XV]|V?I{0,3})$");

    /**
     * 改进后的 isRomanNumeral 方法如果被频繁地调用，会显示出明显的性能优势
     * 除了提高性能之外，可以说代码也更清晰了 将不可见的 Pattern实例做成 final 静态域时，
     * 可以给它起个名字，这样会比正 表达式本身更有可读性
     *
     *
     * @param s
     * @return
     */
    static boolean isRomanNumeral1(String s){
        return ROMAN.matcher(s).matches();
    }

}
